package com.future;

import java.util.Stack;

/**
 * Description:
 * 给你一个字符串 path ，表示指向某一文件或目录的Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。
 * 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..）表示将目录切换到上一级（指向父目录）；
 * 两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。
 * 请注意，返回的 规范路径 必须遵循下述格式：
 * 始终以斜杠 '/' 开头。
 * 两个目录名之间必须只有一个斜杠 '/' 。
 * 最后一个目录名（如果存在）不能 以 '/' 结尾。
 * 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
 * 返回简化后得到的 规范路径 。
 * 示例 1：
 * 输入：path = "/home/"
 * 输出："/home"
 * 解释：注意，最后一个目录名后面没有斜杠。
 * 示例 2：
 * 输入：path = "/../"
 * 输出："/"
 * 解释：从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。
 * 示例 3：
 * 输入：path = "/home//foo/"
 * 输出："/home/foo"
 * 解释：在规范路径中，多个连续斜杠需要用一个斜杠替换。
 * 示例 4：
 * 输入：path = "/a/./b/../../c/"
 * 输出："/c"
 * 提示：
 * 1 <= path.length <= 3000
 * path 由英文字母，数字，'.'，'/' 或 '_' 组成。
 * path 是一个有效的 Unix 风格绝对路径。
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/simplify-path
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2021/11/2 14:21
 */
public class Solution_simplifyPath_71 {

    public static void main(String[] args) {
        String path = "/home/";
        path = "/home//foo/";
        path = "/a/./b/../../c/";
        path = "/../";
        System.out.println(simplifyPath_init(path));
        System.out.println(simplifyPath_my(path));
    }

    /**
     * 答案
     *
     * @param path
     * @return
     */
    public static String simplifyPath_init(String path) {
        Stack<String> stack = new Stack<>();
        StringBuilder ret = new StringBuilder();
        String[] split = path.split("/");
        for (String p : split) {
            if (!stack.empty() && p.equals("..")) {
                stack.pop();
            } else if (!" ..".contains(p)) {
                stack.push(p);
            }
        }
        for (String i : stack) {
            ret.append("/" + i);
        }
        return ret.length() == 0 ? "/" : ret.toString();
    }

    /**
     * 思路：
     * 1、根据"/"分割成字符串数组
     * 2、遇到".."就从栈中弹出一个字符串（stack非空情况！）
     * 3、过滤掉为".",""（空字符串）的字符串，入栈
     *
     * @param path
     * @return
     */
    public static String simplifyPath_my(String path) {
        Stack<String> stack = new Stack<>();
        String[] paths = path.split("/");
        for (String str : paths) {
            //如果是"..",就退到上一层
            if (!stack.isEmpty() && str.equals("..")) {
                stack.pop();
            } else if (!"".equals(str) && !".".equals(str) && !"..".equals(str)) {
                // ".."当stack为空时会进来，需要过滤掉
                stack.push(str);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (String s : stack) {
            sb.append("/" + s);
        }
        return stack.empty() ? "/" : sb.toString();
    }
}
